Hardware performance counters are processor registers that count performance events such as cache misses, virtual memory translation look-aside buffer misses, and number of executed instructions. Some software profiling tools employ hardware performance counters to sample hardware events associated with code execution in order to characterize software performance. OProfile for Linux is an example of such a software profiling tool. Such software profiling tools operate above or within an operating system that in turn operates directly on computer hardware. To profile a specific event, a hardware performance counter is programmed to generate an interrupt to the operating system upon the hardware performance counter reaching a specified count for the specific event. Upon receiving the interrupt, the interrupt handler of the operating system reads the program counter at the time of the interrupt to determine the software that was executing when the hardware performance counter reached the specified count. Typically, the hardware performance counter is reprogrammed each time it expires, which generates a sequence of samples for the specific event. The sequence of samples provides a statistical distribution for the specific event, which may be used to characterize software that was executing while the samples were taken. This provides insight into the portion of the software that is generating the most instances of the specific event. For example, a particular sequence of samples may track instructions that are executing most often. Multiple hardware events may be simultaneously profiled to improve the characterization of the software. Usually, software profiling tools such as OProfile use a non-maskable interrupt upon reaching the specified count since non-maskable interrupts allow profiling of system software that runs with interrupts disabled. However, a maskable interrupt is sometimes used when profiling software that executes with interrupts enabled.
A virtual machine monitor is a software layer that interposes between one or more operating system instances and computer hardware. Sometimes the virtual machine monitor is referred to as a hypervisor, which is a reference to the virtual machine monitor's privilege level. It is a “hypervisor” because its privilege level exceeds a “supervisor” privilege level of an operating system's kernel mode. Each operating system instance is referred to as a virtual machine, which is capable of running its own applications. The virtual machine monitor allocates processor time and memory space to each virtual machine. For example, consider first and second virtual machines that are operating above a virtual machine monitor. In a first time period, the processor is allocated to the first virtual machine; in a second time period, the processor is allocated to the second virtual machine; in a third time period, the processor is allocated to the first virtual machine again; and so forth. Because a virtual machine that hosts an operating system might not be operating when an interrupt is issued, the operating system hosted by the virtual machine is unable to reliably receive interrupts. This makes profiling tools inoperable in virtual machines.